【AWS】Route53をgitで管理する「Roadworker」を早速試してみました
はじめに
こんにちは植木和樹です。8月23日にcloudpackさん主催のcloudpack night #7に参加してきました。夜8時すぎから始まった懇親会では、AWSを利用している各社の気合の入ったライトニングトークを聞くことができました。その中で「Roadworker」というツールをクックパッド株式会社の菅原さんが紹介されていました。
「cloudpack Night #7で発表しました / Roadworkerというツールを作りました」
このツールは一言でいうとRoute53(DNS)のレコードをChefやPuppetのようにコードで管理できる(もちろん冪等性も!)というものです。素晴らしいですね。動作デモの様子が上記ページにあるYoutubeの動画で紹介されていますが、とても簡単にDNSレコードをコードで管理できる様子がわかります。
それでは早速試してみましょう!
準備するもの
- AWSアカウント
- Route53 Fullaccess権限をもったIAMインスタンスプロファイル(またはアクセスキー+シークレットアクセスキー)
- Route53のゾーン(Hosted Zone)(今回は事前に作成しましたが、なくても良さそう)
- Roadworkerを実行するためのLinux環境(今回はAmazon LinuxのEC2を使用)
- Ruby >= 1.9
$ sudo yum -y install git rubygems19 make gcc ruby19-devel libxml2-devel libxslt-devel $ gem1.9 search roadworker -r roadworker (0.3.2) $ sudo gem1.9 install roadworker --no-rdoc --no-ri : Successfully installed uuidtools-2.1.4 Successfully installed nokogiri-1.5.10 Successfully installed json-1.8.0 Successfully installed aws-sdk-1.15.0 Successfully installed tins-0.9.0 Successfully installed term-ansicolor-1.2.2 Successfully installed net-dns-0.8.0 Successfully installed systemu-2.5.2 Successfully installed macaddr-1.6.1 Successfully installed uuid-2.3.7 Successfully installed roadworker-0.3.2 : 11 gems installed
インストールができました。コマンドを実行してみましょう。
$ roadwork --version roadwork 0.3.2
レコードの作成/更新
最初に作業ディレクトリを作成しgit initしておきます。
$ mkdir route53 $ cd route53 $ git config --global user.name "Kazuki Ueki" $ git config --global user.email ueki.kazuki@example.com $ git init .
まずはRoutefileファイルを作成します。これはChefでいうレシピファイルにあたるものです。-e(--export)オプションをつけることで現在のレコード情報をエクスポートし、-o(--output)で指定したファイルに出力することができます。
$ roadwork -e -o Routefile Export Route53 to `Routefile` $ cat Routefile hosted_zone "example.com." do end $ git add . $ git commit -m "first commit"
複数ドメインを管理している場合はRoutefileにhosted_zoneが複数出力され、1ファイルで複数ドメインが管理できるようです。
それでは実際にレコードを追加してみましょう。頻繁に使うレコードタイプはA、MX、それとAWS固有のALIASあたりでしょうか。いずれもRoadworkerのドキュメントにサンプルが載っていますので、それを参考に使ってみましょう。
Routefile
hosted_zone "example.com." do rrset "www.example.com.", "A" do ttl 300 resource_records( "10.0.10.11", "10.0.10.12" ) end rrset "example.com.", "MX" do ttl 600 resource_records( "10 mx.example.com", "10 mx2.example.com" ) end rrset "example.com.", "A" do dns_name "elb-0000000000.ap-northeast-1.elb.amazonaws.com" end end
ここで一つ注意することがあります。ALIAS(dns_name)で指定するELBのホスト名は実際にDNSで名前解決できるものでなければいけません。存在しないホスト名を指定した場合はレコード適用時に「Tried to create an alias that targets example.com., type A in zone Z2YNXXXXXXXXXX, but that target was not found」となりレコードの更新に失敗します。
2013.08.25 20:00 追記
菅原さんからのコメントにあるように、設定ファイルはデフォルトでRoutefileになりますが、-f(--file)オプションで異なるファイル名を指定することができるそうです。
ファイルができたら-a(--apply)でレコードを適用しますが、その前にdry-runさせて記述に誤りがないか確認しましょう。
$ roadwork --dry-run -a -f Routefile Apply `Routefile` to Route53 (dry-run) Create ResourceRecordSet: www.example.com A (dry-run) Create ResourceRecordSet: example.com MX (dry-run) Create ResourceRecordSet: example.com A (dry-run) No change $ git add . $ git commit -m "Add a,mx,alias records"
問題ないようなので実際に適用しましょう。冪等性確認のため2度実行してみます。
(1度目) $ roadwork -a -f Routefile Apply `Routefile` to Route53 Create ResourceRecordSet: www.example.com A Create ResourceRecordSet: example.com MX Create ResourceRecordSet: example.com A (2度目) $ roadwork -a -f Routefile Apply `Routefile` to Route53 No change
2度目のapplyの時には冪等性が働いて「No change」となっていますね。
問題なく適用できたようなのでマネージメントコンソールのRoute53の画面で確認してみましょう。
マネージメントコンソールでwww.example.comのAレコードを書き換えて、再度roadworkerを実行してみましょう。差異を検出してRoutefileの内容に書き換えてくれます。
$ roadwork -a -f Routefile Apply `Routefile` to Route53 Update ResourceRecordSet: www.example.com. A set resource_records=[{:value=>"10.0.10.11"}, {:value=>"10.0.10.12"}]: www.example.com. A
テスト
Roadworkには-t(--test)オプションがあり、実際にDNSでレコードを引いた結果とRoutefileとの結果を比較し、違いがあればテストが失敗します。なお今回はexample.comで試しているので、テストはすべて失敗してしまいます。このテストをレコード更新時に走らせることでオペミス(!)を即時発見できるようになっています。
DNSのオペミスの怖さを経験した方なら・・・このありがたさが、きっとわかると思います
まとめ
Roadworkerを使うことでDNSも「コード」として管理できるようになりました。使い方も簡単で、とても素敵です。特にdry-runとtestの機能がついていることで、レコードの更新前後にテストができる点がうれしいです。
さてこれで、CloudFormationでインスタンス構築をコード化し、Chefでミドルウェアの構成をコード化し、RoadworkerでDNSレコードをコード化することができました。まさにInfrastructure as Codeですね。ぜひ皆さんもRoadworkerを試してみて、マネージメントコンソールを使わずコードでAWSを管理できる便利さを実感してみてください。